// TypeScript 的核心原则之一是对值所具有的结构进行类型检查。

// `接口是对象的状态(属性)和行为(方法)的抽象(描述)`

/*
需求: 创建人的对象, 需要对人的属性进行一定的约束
  id是number类型, 必须有, 只读的
  name是string类型, 必须有
  age是number类型, 必须有
  sex是string类型, 可以没有
*/



interface  Peron{
    readonly id:number;
    name:string;
    age:number;
    sex?:string
}




let p:Peron = {
    id: 1000,
    name: "king",
    age: 18,
    // sex: "男"
}

p.name="jack"

// p.id = 1001

/*
    4.接口定义函数类型
    接口能够描述 JavaScript 中对象拥有的各种各样的外形。 除了描述带有属性的普通对象外，接口也可以描述函数类型。
    为了使用接口表示函数类型，我们需要给接口定义一个调用签名。它就像是一个只有参数列表和返回值类型的函数定义。
    参数列表里的每个参数都需要名字和类型。
*/

interface  SeachFunc{
    // 调用签名
    (source:string,sub:string):boolean
}


let serarch:SeachFunc  = function (source:string,sub:string):boolean {
    return source.search(sub) > -1
}


console.log(serarch("abcd","bc"));


/*
    5.接口定义类类型
    与 C# 或 Java 里接口的基本作用一样，TypeScript 也能够用它来明确的强制一个类去符合某种契约。
    1. 一个类可以实现多个接口
    2. 一个接口可以继承多个接口
*/

// 1. 一个类可以实现多个接口

interface Alarm {
    // 抽象方法
    alert():void
}

interface Light {
    // 抽象方法
    lighton():void
    lightoff():void
}
// 类实现接口
class Car  implements  Alarm{
    alert(): void {
        
    }
    
}
class Car2  implements  Alarm,Light{
    lighton(): void {
       
    }
    lightoff(): void {
       
    }
    alert(): void {
        
    }
    
}



/*
    6.接口继承接口
    和类一样，接口也可以相互继承。 
    这让我们能够从一个接口里复制成员到另一个接口里，可以更灵活地将接口分割到可重用的模块里。
*/
// 继承 extends
interface  LightAndAlarm extends  Light,Alarm{
    
}